/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sgs.mb;

import br.com.sgs.auxiliar.ProcessoAux;
import br.com.sgs.auxiliar.SolicitacaoAux;
import br.com.sgs.bundle.MessageBundleLoader;
import br.com.sgs.entity.Etapa;
import br.com.sgs.entity.Funcionario;
import br.com.sgs.entity.Processo;
import br.com.sgs.entity.Solicitacao;
import br.com.sgs.fachada.Fachada;
import br.com.sgs.fachada.IFachada;
import br.com.sgs.fachada.SolicitacaoFachada;
import br.com.sgs.fachada.SolicitacaoIFachada;
import br.com.sgs.util.DataValue;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Eric
 */
@ManagedBean(name="funcionarioSolicitacaoMB")
@ViewScoped
public class FuncionarioSolicitacaoMB implements Serializable {
    
    @ManagedProperty(value = "#{loginMB}")
    private LoginMB lmb;
    
    
    private List<Solicitacao> lssolicitacao = new ArrayList<Solicitacao>();
    private Solicitacao solicitacaoselecionada;
    private Funcionario funcionarioselecionado;
       
    //parametro de busca
    private String busca;
    
    //visualizar
    private String strdescricao;
    private String straluno;
    private String strstatus;
    private String strdepartamento;
    private String strfuncionario;
    private String stretapaatual;
    private String strprocessoatual;
    private String stretapaatualstatus;
    private Date strdtcriacao;
    private Date strprazo;
    
    private List<Etapa> lsetapa = new ArrayList<Etapa>();
    private List<Processo> lsprocesso = new ArrayList<Processo>();
    private List<String> lsstatus = new ArrayList<String>();
    
    private Processo processoselecionado;
    
    /**
     * Creates a new instance of InstituicaoNew
     */
    public FuncionarioSolicitacaoMB() {
    }
    
    @PostConstruct
    public void init() {
        try {
            
            for (DataValue lsd : SolicitacaoAux.getStatusLista()) {
                this.getLsstatus().add(lsd.getValue());
            }

            funcionarioselecionado = lmb.getFuncionario();
           
            SolicitacaoIFachada ifach = new SolicitacaoFachada();
            setLssolicitacao(ifach.findSolicitacaoByAll("", null, null, getLsstatus(), 0, funcionarioselecionado.getDepartamento()));  
            
            rotinaCancelar();
            
        } catch (Exception e) {
            System.err.println("Erro no init do funcionarioSolicitacaoMB");
            e.printStackTrace();
        }
    }
   
    public void atualizarTabela() {
        try {
            
            SolicitacaoIFachada ifach = new SolicitacaoFachada();
            setLssolicitacao(ifach.findSolicitacaoByAll("", null, null, getLsstatus(), 0, funcionarioselecionado.getDepartamento()));  
        
        } catch (Exception e) {
            System.err.println("Erro no atualizarTabela");
        }
    }

    
    public void buscar() {
        try {
            
            SolicitacaoIFachada ifach = new SolicitacaoFachada();
            setLssolicitacao(ifach.findSolicitacaoByAll(getBusca(), null, null, getLsstatus(), 0, funcionarioselecionado.getDepartamento()));  
            
        } catch (Exception e) {
            System.err.println("Erron no método buscar");
            e.printStackTrace();
        }
    }
    
    public void cancelar() {
        try {

            IFachada ifach = new Fachada();

            Solicitacao solicitacao = getSolicitacaoselecionada();
            solicitacao.setStatus(SolicitacaoAux.CANCELADA);
            
            ifach.alterar(solicitacao);

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, MessageBundleLoader.getMessage("msgExcluidoSucesso"), ""));
            atualizarTabela();

        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, MessageBundleLoader.getMessage("msgexclusaoErro"), ""));
        }
    }
    
    public void rotinaCancelar() {
        try {

            int dias = 5;
            Calendar caldt = Calendar.getInstance();
            Calendar calprazo = Calendar.getInstance(); 

            if (lssolicitacao.size() > 0) {

                for (Solicitacao solicitacao : lssolicitacao) {

                    calprazo.setTime(calculaData(solicitacao.getDtcriacao(), solicitacao));
                    caldt.add(Calendar.DAY_OF_MONTH, dias);
                    
                    if (solicitacao.getStatus() != SolicitacaoAux.CONCLUIDA) {
                       
                        if (calprazo.getTime().after(caldt.getTime())) {
                            SolicitacaoIFachada ifach = new SolicitacaoFachada();
                            solicitacao.setStatus(SolicitacaoAux.CANCELADA);
                            ifach.alterar(solicitacao);

                        }
                    }
                }

            }

        } catch (Exception e) {
            System.err.println("Erro na rotina cancelar");
            e.printStackTrace();
        }
    }

    public void assumirSolicitacao() {
        try {

            Solicitacao solicitacao = getSolicitacaoselecionada();

            if (solicitacao.getFuncionario() == null && solicitacao.getStatus() == SolicitacaoAux.ABERTA) {
                IFachada ifach = new Fachada();
                solicitacao.setFuncionario(lmb.getFuncionario());

                ifach.alterar(solicitacao);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, MessageBundleLoader.getMessage("msgDesignadoSucesso"), ""));
                atualizarTabela();
       
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, MessageBundleLoader.getMessage("msgassumirSolicitacao"), ""));
            }

        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, MessageBundleLoader.getMessage("msgexclusaoErro"), ""));
        }
    }
    
    public void buscarEtapa() {
        try {
                        
           lsetapa = solicitacaoselecionada.getModeloSolicitacao().getLsetapa();

        } catch (Exception e) {
            System.err.println("Erro no metodo buscarProcessos");
            e.printStackTrace();
        }
    }
    
      public void buscarProcesso(Etapa etapa) {
        try {

            lsprocesso = etapa.getLsprocesso();
            
        } catch (Exception e) {
            System.err.println("Erro no metodo buscarProcessos");
            e.printStackTrace();
        }
    }

    public String editar() {
        try {
           return "ALUNOSOLICITACAOLIST";
        } catch (Exception e) {
           return null;
        }
    }
   
    public void visualizar(Solicitacao solicitacao) {
        try {
            
            solicitacaoselecionada = solicitacao;
            
            strdescricao = solicitacaoselecionada.getModeloSolicitacao().getDescricao();
            straluno = solicitacaoselecionada.getAluno().getNome();
            strdtcriacao = solicitacaoselecionada.getModeloSolicitacao().getDtcriacao();
            strdepartamento = solicitacaoselecionada.getEtapaatual().getDepartamento().getDescricao();
            stretapaatual  = solicitacaoselecionada.getEtapaatual().getDescricao();
            stretapaatualstatus = solicitacaoselecionada.getEtapaatual().getStatus().getDescricao();
            strprocessoatual = solicitacaoselecionada.getProcessoAtual().getOrientacao();
            strprazo = calculaData(solicitacaoselecionada.getDtcriacao(),solicitacao);
            
            if (solicitacaoselecionada.getFuncionario() != null) {
                strfuncionario = solicitacaoselecionada.getFuncionario().getNome();
            }
            
            buscarEtapa();

        } catch (Exception e) {
            System.err.println("Erro no visualizar");
            e.printStackTrace();
        }
    }
    
    public void selecionarRegistro(Solicitacao solicitacao) {
        try {

            setSolicitacaoselecionada(solicitacao);

        } catch (Exception e) {
            System.err.println("Erro no metodo selecionarRegistro");
        }
    }
    
     public void selecionarProcesso(Processo processo) {
        try {
            
            processoselecionado = processo;
            
        } catch (Exception e) {
            System.err.println("Erro no metodo selecionarProcesso");
        }
    }
    
    public void proximoProcesso() {
        try {

            if (solicitacaoselecionada.getFuncionario() != null) {
                SolicitacaoIFachada fachada = new SolicitacaoFachada();
                fachada.proximoProcesso(solicitacaoselecionada);

                atualizarTabela();
          
            } else {
                 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, MessageBundleLoader.getMessage("msgAvancarProcesso"), ""));
            }

        } catch (Exception e) {
            System.err.println("Erro no metodo proximoProcesso");
            e.printStackTrace();
        }
    }
    
    public boolean validaProcesso(Processo processo) {
        try {

            boolean success = false;

            if (solicitacaoselecionada.getStatus() != 2) {


                setProcessoselecionado(processo);

                for (Processo p : solicitacaoselecionada.getEtapaatual().getLsprocesso()) {

                    if (p.equals(processo)) {
                        success = true;
                    }

                }

                atualizarTabela();

            }

            return success;

        } catch (Exception e) {
            System.err.println("Erro no validaProcesso");
            e.printStackTrace();
            return false;
        }
    }
            
    
    
    public Date calculaData(Date data, Solicitacao solicitacao) {
        try {

            Calendar calendar = Calendar.getInstance();
            int dias = 0;

            for (Etapa etapa : solicitacao.getModeloSolicitacao().getLsetapa()) {
                dias = etapa.getPrazo();
            }

            calendar.setTime(data);
            calendar.add(Calendar.DAY_OF_MONTH, dias);
            
            data = calendar.getTime();

            return data;


        } catch (Exception e) {
            System.err.println("Erro no calcularData");
            e.printStackTrace();
            return null;
        }

    }
  
    public String strStatusProcessoLabel(int st) {
        return MessageBundleLoader.getMessage(ProcessoAux.getStatusLabel(st));
    }
    
    public String strStatusLabel(int st) {
        return MessageBundleLoader.getMessage(SolicitacaoAux.getStatusLabel(st));
    }

    /**
     * @return the lmb
     */
    public LoginMB getLmb() {
        return lmb;
    }

    /**
     * @param lmb the lmb to set
     */
    public void setLmb(LoginMB lmb) {
        this.lmb = lmb;
    }

    
    /**
     * @return the solicitacaoselecionada
     */
    public Solicitacao getSolicitacaoselecionada() {
        return solicitacaoselecionada;
    }

    /**
     * @param solicitacaoselecionada the solicitacaoselecionada to set
     */
    public void setSolicitacaoselecionada(Solicitacao solicitacaoselecionada) {
        this.solicitacaoselecionada = solicitacaoselecionada;
    }

    /**
     * @return the busca
     */
    public String getBusca() {
        return busca;
    }

    /**
     * @param busca the busca to set
     */
    public void setBusca(String busca) {
        this.busca = busca;
    }

    /**
     * @return the strdescricao
     */
    public String getStrdescricao() {
        return strdescricao;
    }

    /**
     * @param strdescricao the strdescricao to set
     */
    public void setStrdescricao(String strdescricao) {
        this.strdescricao = strdescricao;
    }

    /**
     * @return the strstatus
     */
    public String getStrstatus() {
        return strstatus;
    }

    /**
     * @param strstatus the strstatus to set
     */
    public void setStrstatus(String strstatus) {
        this.strstatus = strstatus;
    }

    /**
     * @return the strdepartamento
     */
    public String getStrdepartamento() {
        return strdepartamento;
    }

    /**
     * @param strdepartamento the strdepartamento to set
     */
    public void setStrdepartamento(String strdepartamento) {
        this.strdepartamento = strdepartamento;
    }

    /**
     * @return the strdtcriacao
     */
    public Date getStrdtcriacao() {
        return strdtcriacao;
    }

    /**
     * @param strdtcriacao the strdtcriacao to set
     */
    public void setStrdtcriacao(Date strdtcriacao) {
        this.strdtcriacao = strdtcriacao;
    }

    /**
     * @return the strprazo
     */
    public Date getStrprazo() {
        return strprazo;
    }

    /**
     * @param strprazo the strprazo to set
     */
    public void setStrprazo(Date strprazo) {
        this.strprazo = strprazo;
    }

    /**
     * @return the lsetapa
     */
    public List<Etapa> getLsetapa() {
        return lsetapa;
    }

    /**
     * @param lsetapa the lsetapa to set
     */
    public void setLsetapa(List<Etapa> lsetapa) {
        this.lsetapa = lsetapa;
    }

    /**
     * @return the lsprocesso
     */
    public List<Processo> getLsprocesso() {
        return lsprocesso;
    }

    /**
     * @param lsprocesso the lsprocesso to set
     */
    public void setLsprocesso(List<Processo> lsprocesso) {
        this.lsprocesso = lsprocesso;
    }

    /**
     * @return the lsstatus
     */
    public List<String> getLsstatus() {
        return lsstatus;
    }

    /**
     * @param lsstatus the lsstatus to set
     */
    public void setLsstatus(List<String> lsstatus) {
        this.lsstatus = lsstatus;
    }

    /**
     * @return the lssolicitacao
     */
    public List<Solicitacao> getLssolicitacao() {
        return lssolicitacao;
    }

    /**
     * @param lssolicitacao the lssolicitacao to set
     */
    public void setLssolicitacao(List<Solicitacao> lssolicitacao) {
        this.lssolicitacao = lssolicitacao;
    }

    /**
     * @return the stretapaatual
     */
    public String getStretapaatual() {
        return stretapaatual;
    }

    /**
     * @param stretapaatual the stretapaatual to set
     */
    public void setStretapaatual(String stretapaatual) {
        this.stretapaatual = stretapaatual;
    }

    /**
     * @return the strprocessoatual
     */
    public String getStrprocessoatual() {
        return strprocessoatual;
    }

    /**
     * @param strprocessoatual the strprocessoatual to set
     */
    public void setStrprocessoatual(String strprocessoatual) {
        this.strprocessoatual = strprocessoatual;
    }

    /**
     * @return the stretapaatualstatus
     */
    public String getStretapaatualstatus() {
        return stretapaatualstatus;
    }

    /**
     * @param stretapaatualstatus the stretapaatualstatus to set
     */
    public void setStretapaatualstatus(String stretapaatualstatus) {
        this.stretapaatualstatus = stretapaatualstatus;
    }

    /**
     * @return the straluno
     */
    public String getStraluno() {
        return straluno;
    }

    /**
     * @param straluno the straluno to set
     */
    public void setStraluno(String straluno) {
        this.straluno = straluno;
    }

    /**
     * @return the strfuncionario
     */
    public String getStrfuncionario() {
        return strfuncionario;
    }

    /**
     * @param strfuncionario the strfuncionario to set
     */
    public void setStrfuncionario(String strfuncionario) {
        this.strfuncionario = strfuncionario;
    }

    /**
     * @return the processoselecionado
     */
    public Processo getProcessoselecionado() {
        return processoselecionado;
    }

    /**
     * @param processoselecionado the processoselecionado to set
     */
    public void setProcessoselecionado(Processo processoselecionado) {
        this.processoselecionado = processoselecionado;
    }

}
